package banco_imobiliario.control;

import banco_imobiliario.model.*;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author PRISCILA
 */
public class ControladorBancoImobiliario {

    int contadorDeRodadas = 1;
    private Baralho baralho;
    private boolean TirarDuplasNosDadosJogaNovamente;
    private boolean Tirar3DuplasSeguidasVaiPraPrisão;
    private boolean GerarValoresDosDadosAleatoriamente;
    private int PontoDePartidaRepoe;
    private List<Jogador> jogadores;
    private Jogador jogadorDaVez;
    private Tabuleiro tabuleiro;
    public static ControladorBancoImobiliario instancia;
    private int qtdRodadas = 0;

    protected ControladorBancoImobiliario() {
        jogadores = new ArrayList<>();
        jogadorDaVez = new Jogador();
    }

    public static ControladorBancoImobiliario getInstancia() {
        //Implementação do Singleton
        if (instancia == null) {
            instancia = new ControladorBancoImobiliario();
        }
        return instancia;
    }

    public void carregarDadosDoTabuleiro() {
        //Atribuindo a responsabilidade de criar o tabuleiro ao IniciadoDeTabuleiro segundo o padrão Build
        DiretorIniciadorDeTabuleiro iniciadorDeTabuleiro = new DiretorIniciadorDeTabuleiro();
        this.tabuleiro = iniciadorDeTabuleiro.criarTabuleiro();
//        System.out.println("criou tabuleiro: " + tabuleiro.toString());
        instancia = this;
        //Criando o baralho de Noticias
        instanciarBaralho();
    }

    private void instanciarBaralho() {
        //Cria a lista de noticia no baralho
        this.baralho = baralho.getInstancia();
        baralho.criar();
    }

    public List<Jogador> retornarJogadores() {
        return jogadores;
    }

    public void estabelecerLocalizacaoJogador(Jogador jogadorDaVez, Dado dadoUm, Dado dadoDois) {

        //Logradouro loc = jogadorDaVez.obterLocalizacao();
        //int num = dadoUm.getValorDaFace();
        //int num2= dadoDois.getValorDaFace();
        //System.out.println("num: "+num+". num2: "+num2+". localizacao: "+loc.getIndice());
        //Logradouro casa = tabuleiro.obterCasa(loc, num + num2);
        //System.out.println("localizacao dps: "+casa.getIndice());
        System.out.println(jogadorDaVez.obterLocalizacao().getNome());
        if (jogadorDaVez.obterLocalizacao().getNome().equals("Prisão")) {
            LogradouroPrisao prisao = (LogradouroPrisao) jogadorDaVez.getPeca().getLocalizacao();
            prisao.setValorDosDados(jogadorDaVez.getDado1(), jogadorDaVez.getDado2());
            jogadorDaVez.getPeca().getLocalizacao().atingida(jogadorDaVez);
        } else {
            jogadorDaVez.estabelecerLocalizacao(tabuleiro.obterCasa(jogadorDaVez.obterLocalizacao(), dadoUm.getValorDaFace() + dadoDois.getValorDaFace()));
        }
    }

    public void adicionarJogador(Jogador jogador) {
        jogador.getPeca().setLocalizacao(tabuleiro.obterCasaInicial());
        jogadores.add(jogador);
    }

    public void removeJogador(Jogador jogador) {
        jogadores.remove(jogador);
    }

    void setConfiguracoes(boolean TirarDuplasNosDadosJogaNovamente, boolean Tirar3DuplasSeguidasVaiPraPrisão, boolean GerarValoresDosDadosAleatoriamente, int PontoDePartidaRepoe) {
        this.TirarDuplasNosDadosJogaNovamente = TirarDuplasNosDadosJogaNovamente;
        this.Tirar3DuplasSeguidasVaiPraPrisão = Tirar3DuplasSeguidasVaiPraPrisão;
        this.GerarValoresDosDadosAleatoriamente = GerarValoresDosDadosAleatoriamente;
        this.PontoDePartidaRepoe = PontoDePartidaRepoe;
    }

    public void estebelecerJogadorDaVez(Jogador jogador) {
        for(int i=0; i<jogadores.size();i++){
            if(jogador==jogadores.get(i)){
                if(i==jogadores.size()-1){
                    i=-1;
                }
                jogadorDaVez = jogadores.get(i+1);
                break;
            }
        }
        
    }

    public void mostrarNoticia(Noticia Carta) {
        ControladorInterface controlInterface = ControladorInterface.getInstancia();
        controlInterface.mostrarNoticia(Carta);
    }

    void debitarJogadorDaVez(Jogador jogador, double valor) {
        for (int i = 0; i < jogadores.size(); i++) {
            if (jogador == jogadores.get(i)) {
                jogadores.get(i).addObserver(jogador.retornarObserver());
                if (jogadores.get(i).debitar(valor)) {
                    System.out.println("debitou");
                }

            }
        }
    }

    public void comprarLogradouro(Logradouro aThis) {
        ControladorInterface controlInterface = ControladorInterface.getInstancia();
        controlInterface.comprarLogradouro(aThis);
    }

    void comprarLogradouro(Jogador jogadorDaVez) {
        CasaDePropriedade casa = (CasaDePropriedade) jogadorDaVez.getPeca().getLocalizacao();
        casa.setProprietario(jogadorDaVez);
    }

    public int getQtdRodadas() {
        return qtdRodadas;
    }

    public void setQtdRodadas(int qtdRodadas) {
        this.qtdRodadas = qtdRodadas;
    }

    public void sairDaPrisao(Jogador jogador, Dado dadoUm, Dado dadoDois) {
        jogador.estabelecerLocalizacao(tabuleiro.obterCasa(jogador.obterLocalizacao(), dadoUm.getValorDaFace() + dadoDois.getValorDaFace()));
    }
    
    public void mostraProprietario(){
        System.out.println("imprindo proprietario: "+tabuleiro.toString());
    }

    List<Logradouro> retornaPropriedades(Jogador jogador) {
        return tabuleiro.retornarPropridades(jogador);
    }

    Jogador retornaJogadorDaVez() {
        return jogadorDaVez;
    }
        
}
